﻿CREATE PROCEDURE [dbo].[LedgerSubcontoTypesDelete]
(--список субконто для типов проводок для импорта в 1С
	@Original_Id int,
	@Original_MD datetime,
	@MW varchar(50) -- если = PhysicallyDelete то запись удаляется физически. В противном случае поле ToDelete устанавливается в 1
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int
DECLARE @datMD datetime, @intDepartmentId int, @bitPhysicallyDelete bit

	SET NOCOUNT ON;

IF (@Original_Id Is Null) OR (@Original_MD Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @intRet = Id
FROM [CO].LedgerSubcontoTypes WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

IF (@Original_Id = 1)
BEGIN
	SELECT @intErrCode = 3, @strMsg = 'Нельзя удалять субконто с кодом равным 1!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

--проверка существования типов проводок в которых используется удаляемое субконто
IF EXISTS (SELECT ID FROM [CO].LedgerTransTypes WHERE 
DebitSubcontoTypeId1 = @Original_Id
OR DebitSubcontoTypeId2 = @Original_Id
OR DebitSubcontoTypeId3 = @Original_Id
OR DebitSubcontoTypeId4 = @Original_Id
OR DebitSubcontoTypeId5 = @Original_Id
OR CreditSubcontoTypeId1 = @Original_Id
OR CreditSubcontoTypeId2 = @Original_Id
OR CreditSubcontoTypeId3 = @Original_Id
OR CreditSubcontoTypeId4 = @Original_Id
OR CreditSubcontoTypeId5 = @Original_Id
) 
BEGIN
	SELECT @intErrCode = 4, @strMsg = 'Существуют типы проводок, в которых используется удаляемое субконто!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

--Проверка возможности физического удаления записи из таблиц справочников
EXEC @intRet = dbo.CheckDictionaryDelete @bitPhysicallyDelete OUTPUT, @intDepartmentId OUTPUT, @MW OUTPUT
IF @intRet <> 0 RETURN @intRet

EXEC [dbo].[ProcessStatistic] Null, @datMD OUTPUT, @MW OUTPUT

	SET NOCOUNT OFF;
IF @intDepartmentId <> 0 --в поздразделениях запись всегда физически удаляется
	DELETE FROM [CO].LedgerSubcontoTypes WHERE Id = @Original_Id
ELSE
BEGIN
	IF @bitPhysicallyDelete = 1
		DELETE FROM [CO].LedgerSubcontoTypes WHERE Id = @Original_Id
	ELSE --Обычные пользователи только помечают запись для удаления
		UPDATE [CO].LedgerSubcontoTypes SET 
		ToDelete = 1,
		[MD] = @datMD, [MW] = @MW
		WHERE Id = @Original_Id
END

RETURN @@error